#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"queue.h"

int get_next_index(Queue queue,int index);
void* xmalloc(size_t size);

struct Queue_tag{
	int *data;　
	int size; 
	int front; //元素的頭
	int tail;  //元素的尾
};

Queue queue_create(int size)
{
	struct Queue_tag* queue;

	assert(size >0);

	size +=1;
	/*
	front ==tail的情況下，陣列元素無法使用，所以將size+1
	*/

	queue=xmalloc(sizeof(struct Queue_tag));
	queue->data = xmalloc(sizeof(int)*size);
	queue->size = size;
	queue->front=0;
	queue->tail=0;

	return queue;
}
//刪除Queue
void queue_delete(Queue queue)
{
	free(queue->data);
	free(queue);
}
//將元素放入
void queue_enqueue(Queue queue,int value)
{
	assert(get_next_index(queue,queue->tail)!=queue->front);
	queue->data[queue->tail]=value;
//	求下一個元素的位置
	queue->tail=get_next_index(queue,queue->tail);
}
//從Queue裡取出元素
int queue_dequeue(Queue queue)
{
	int pop_value;
	assert(!queue_is_empty(queue));
	pop_value= queue->data[queue->front];

	queue->front=get_next_index(queue,queue->front);
	return pop_value;
}
//檢查Queue是否為空
int queue_is_empty(Queue queue)
{
	return queue->front == queue->tail;
}
//取出之後的元素
int get_next_index(Queue queue,int index)
{
	return (index+1)%queue->size;
}
//檢查記憶體是否分配錯誤 
void* xmalloc(size_t size)
{
	void*p =malloc(size);
	if(p == NULL){
		printf("記憶體分配錯誤\n");
		exit(EXIT_FAILURE);
	}
	return p;
}


